Friday, April 20, 2012

Maxscript - Frameless Glass

Creating same object (or editing predefined .max library) is sucks, especially with simple one like this. So what this script does is take your spline base object (currently works on single object only), shell it, clone, a bit chamfer and merge the object onto single editable poly with different ids for glass and rubber sealant. Due to possible artifact with advance renderer (glass touching solid object), I made air gap between glass and frame/sealant.This script is an amateur work and might not be optimized, if you have a better version please do share with me.





Frameless glass object
ver: 0.1
what this script do and doesnt:
  - Create simple frameless glass object with a simple rubber sealant around the glass perimeter. the glass would have sub-obj id 1 and sealant 2
  - Works with centimeter unit. For conversion edit values marked "-- in cm" with converted value in your file unit.
  - Overall depth of glass with sealant is 2.1 cm
how to use it:
  - Run script (maxscript > run), customize toolbar, drag anywhere to your toolbar or simply create new one.
    The script available under category "- i -".Use mzp for simple drag and drop.
  - Create spline around your window, click assigned button, done.
requirement: tested on 3dsmax 2009
todo:
  - slice glass object larger than predetermined dimension
credits: attaching selection is part of soulburn script

The script or grab .mzp version (drag n drop to max viewport):

macroScript Object_FramelessGlass
category:"- i -"
toolTip:"Frameless Glass"
buttontext:"FG"
(
 o = for i in selection collect i
 if (o.count != 1 or superclassof $ != shape) then
  MessageBox "Please select one spline at a time" title:"Frameless Glass"
 else
 (
  disableSceneRedraw()
  -- checking reversed spline
  reversed = false
  o = $
  convertToSplineShape o
  bb1 = (o.max - o.min)
  applyOffset o .3 -- in cm
  bb2 = (o.max - o.min)
  select o
  deleteSpline o 2
  if (bb1[1] < bb2[1])  then
  (
   reversed = true
   applyOffset o -.3 -- in cm
   -- print "reversed"
  ) else (
   applyOffset o .3 -- in cm
   -- print "normal"
  )
  deleteSpline o 1
  -- glass
  select o
  modPanel.addModToSelection (Shell ()) ui:on
  o.modifiers[#Shell].innerAmount = 0.4  -- in cm
  o.modifiers[#Shell].outerAmount = 0.4 -- in cm
  modPanel.addModToSelection (Materialmodifier ())
   
  -- sealant
  maxOps.cloneNodes o cloneType:#copy newNodes:&nnl
  select nnl
  deleteModifier $ 1
  deleteModifier $ 1
  if reversed == true then ( applyOffset $ .3 ) else (applyOffset $ -.3) -- in cm
  deleteSpline nnl 1
  select nnl
  modPanel.addModToSelection (Shell ()) ui:on
  $.modifiers[#Shell].innerAmount = 0.25 -- in cm
  $.modifiers[#Shell].outerAmount = 0.25 -- in cm
   convertto nnl editable_poly
  subobjectLevel = 4
  $.EditablePoly.SetSelection #Face #{1..2}
  $.insetAmount = 0.5 -- in cm
  $.EditablePoly.buttonOp #Inset
  $.ConvertSelection #Face #Edge
  fedge = polyop.getEdgeSelection $
  $.bridgeSelected = 1
  $.EditablePoly.Bridge ()
  subobjectLevel = 2
  $.EditablePoly.SetSelection #Edge fedge
  $.edgeChamfer = 0.2 -- in cm
  $.edgeChamferSegments = 2
  $.EditablePoly.buttonOp #Chamfer
  move $.Verts [0,0,0.8] -- in cm
  subobjectLevel = 0
  modPanel.addModToSelection (symmetry ()) ui:on
  $.modifiers[#Symmetry].axis = 2
  modPanel.addModToSelection (Materialmodifier ()) ui:on
  $.modifiers[#Material].materialID = 2

  -- attach all object
  convertto o editable_poly
  select o
  for s in selection do append nnl o
  select nnl
  for i in 1 to selection.count do
   Try(ConvertTo Selection[i] Editable_Poly)Catch()
  
  baseObj = selection[1]
  items = #()
  for s in selection do append items s
  for i in items do 
  (
   if (i != baseObj) then (
    if (classof i == Editable_mesh) or (classof i == Editable_Poly) then
     baseObj.EditablePoly.attach i baseObj
   )
  )
  
  -- cleaning up
  enableSceneRedraw()
  completeRedraw()
  gc()
 )
)

Hope someone find it useful.

cheers

No comments:

Post a Comment